package dataStructure;

import java.util.Arrays;

/**
 * @author WuYongheng
 * @date 2022/3/25
 * @description 顺序表，底层采用的是数组，但是长度可以动态的变化
 */
public class ArrayList implements List {

    private Object[] elementData;//底层是一个数组，目前没有定义长度

    private int size;//不是数组分配了几个空间，而是元素的个数

    public ArrayList() {
        //没有指定长度，默认是4
        this(4);
        //没有指定长度，默认是0
        //elementData = new Object[]{};
    }

    //数组的初始长度
    public ArrayList(int initialCapacity) {
        //给数组分配指定数量的空间
        elementData = new Object[initialCapacity];
        //指定顺序表的元素个数，默认是0
        size = 0;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public Object get(int i) {
        if (i < 0 || i >= size) {
            throw new MyArrayIndexOutOfBoundsException("数组索引越界异常：" + i);
        }
        return elementData[i];
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean contains(Object e) {
        return false;
    }

    @Override
    public int indexOf(Object e) {
        return 0;
    }

    @Override
    public void add(int i, Object e) {
        if (i < 0 || i > size) {
            throw new MyArrayIndexOutOfBoundsException("数组索引越界：" + i);
        }
        if (size == elementData.length) {
            grow();
        }
        // 后移元素，从最后一个开始
        for (int j = size; j > i; j--) {
            elementData[j] = elementData[j - 1];
        }
        elementData[i] = e;
        size++;
    }

    @Override
    public void add(Object e) {
        this.add(size, e);
        /*
        //给数组赋值,元素个数 +1
        elementData[size++] = e;
        // 如果数组满了就扩容
        if (size == elementData.length) {
            // 创建一个新的数组，长度是旧数组的2倍
         Object[] newAry = new Object[elementData.length * 2];
            // 将旧数组的数据拷贝到新数组
            for (int i = 0; i < elementData.length; i++) {
                newAry[i] = elementData[i];
            }
            //让就elementData指向新数组
            elementData = newAry;
        }
        // 简化为:grow();
        } else {
            elementData[size] = e;
        }
        */
    }

    /**
     * 扩容的方法
     */
    private void grow() {
        elementData = Arrays.copyOf(elementData, elementData.length * 2);
    }

    @Override
    public boolean addBefore(Object obj, Object e) {
        return false;
    }

    @Override
    public boolean addAfter(Object obj, Object e) {
        return false;
    }

    @Override
    public Object remove(int i) {
        return null;
    }

    @Override
    public boolean remove(Object e) {
        return false;
    }

    @Override
    public Object replace(int i, Object e) {
        return null;
    }
}
